const express = require('express');
const router = express.Router();
const { Course, Category, User,Chapter } = require('../../models')
const{ Op } = require('sequelize')
const {NotFoundError,success,failure} = require('../../utils/response')

//查询列表
router.get('/',async function(req, res, next) {
    try{
        const query = req.query
        //当前页数
        const currentPage = Math.abs(Number(query.currentPage))||1
        //每页显示条数
        const pageSize = Math.abs(Number(query.pageSize))||10 

        const offset = (currentPage-1)*pageSize
        const condition ={
            ...getCondition(),
            order:[['id','ASC']],
            limit:pageSize,
            offset:offset
        }
        if (query.categoryId) {
            condition.where = {
              categoryId: {
                [Op.eq]: query.categoryId
              }
            };
          }
          
          if (query.userId) {
            condition.where = {
              userId: {
                [Op.eq]: query.userId
              }
            };
          }
          
          if (query.name) {
            condition.where = {
              name: {
                [Op.like]: `%${ query.name }%`
              }
            };
          }
          
          if (query.recommended) {
            condition.where = {
              recommended: {
                // 需要转布尔值
                [Op.eq]: query.recommended === 'true'
              }
            };
          }
          
          if (query.introductory) {
            condition.where = {
              introductory: {
                [Op.eq]: query.introductory === 'true'
              }
            };
          }
          
        const {count,rows} = await Course.findAndCountAll(condition)
        success(res,'查询列表成功',{
            courses:rows,
            pagination:{
                total:count,
                currentPage:currentPage,
                pageSize:pageSize
            }
        },200)
    }catch(error){
        failure(res,error)
    }
    
});

//查询详情
router.get('/:id',async function(req, res, next) {
    try{
        const course = await getCourse(req)
        success(res,'查询成功',{ 
            course
        },200) 
    }catch(error){
        failure(res,error)
    }
    
});

//创建
router.post('/',async function(req, res, next) {
    try{
        //白名单过滤
        const body=filterBody(req)
        const course = await Course.create(body)
        success(res,"创建成功",{course},200) 
    }catch(error){
        failure(res,error)
    }
    
});

//删除
router.delete('/:id',async function(req, res, next) {
  try {
    const course = await getCourse(req);

    const count = await Chapter.count({ where: { courseId: req.params.id } });
    if (count > 0) {
      throw new Error('当前课程有章节，无法删除。');
    }

    await course.destroy();
    success(res, '删除课程成功。');
  } catch (error) {
    failure(res, error);
  }
    
});

//更新
router.put('/:id',async function(req, res, next) {
    try{
        const course = await getCourse(req)
        const body = filterBody(req)
        await course.update(body)
        res.json({
            status:true,
            message:"更新课程成功",
            data:course
        })  
    }catch(error){
        res.status(500).json({
            status:false,
            message:"更新课程失败",
            errors:[error.message]
        })
    }
    
});

//公共方法：查询
async function getCourse(req){
    const {id} = req.params
    const condition = getCondition();
    //查询当前课程
    const course= await Course.findByPk(id,condition)
    if(!course){
        throw new NotFoundError(`ID:${id}的课程未找到`)
    }
    return course
}

//白名单过滤
function filterBody(req){
    return {
        categoryId: req.body.categoryId,
        userId: req.body.userId,
        name: req.body.name,
        image: req.body.image,
        recommended: req.body.recommended,
        introductory: req.body.introductory,
        content: req.body.content
      };
}

/**
 * 公共方法：关联分类、用户数据
 */
function getCondition() {
    return {
      attributes: { exclude: ['CategoryId', 'UserId'] },
      include: [
        {
          model: Category,
          as: 'category',
          attributes: ['id', 'name']
        },
        {
          model: User,
          as: 'user',
          attributes: ['id', 'username', 'avatar']
        }
      ]
    }
  }
module.exports = router;
